package rent;
import book.RentBook;
import reader.VIPReadernew;
import common.PayException;
import java.util.*;

public class RentBookManagement {
    /*1.定义必要的成员变量*/
    static final int deadTime = 10;    // 静态类常量，租阅期限，如运行中需要修改则去掉final
    double normalRent = 0.1;    // 实例变量，正常租阅费率
    double delayRent = 0.4;    // 实例变量，超期租阅费率

    VIPReadernew renter;    // 含接口和异常处理的新读者对象
    RentRecord rentrecord;    // 租阅记录对象

    public LinkedList<RentBook> booklist;    // 增加public修饰符，用于存储多个书对象的泛型链表
    public ArrayList<VIPReadernew> readerlist;    // 用于存储多个读者对象的泛型顺序表
    public ArrayList<RentRecord> rentlist;    // 用于存储租书记录的泛型顺序表
    public ArrayList<String> returnlist;    // 用于存储还书记录的泛型顺序表

    int j;    // 循环变量

    /*2.定义构造方法*/
    public RentBookManagement() {  // 定义构造方法，增加了public修饰符
        booklist = new LinkedList<RentBook>();    // 初始化图书链表
        readerlist = new ArrayList<VIPReadernew>();    // 初始化读者顺序表
        rentlist = new ArrayList<RentRecord>();    // 初始化租书记录顺序表
        returnlist = new ArrayList<String>();    // 初始化还书记录顺序表
    }

    /*3.定义几个访问属性的成员方法*/
    public static double getDeadTime() { return deadTime; }
    public void setNormalRent(double newNR) { normalRent = newNR; }
    public double getNormalRent() { return normalRent; }
    public void setDelayRent(double newDR) { delayRent = newDR; }
    public double getDelayRent() { return delayRent; }

    /*4.定义实现图书信息管理功能的成员方法*/
    public void addBook(String isbn, String bname, String bauthor, String bpublisher,
                        double bprice, String no) {
        booklist.add(new RentBook(isbn,bname,bauthor,bpublisher,bprice,no)); // 将新书插在表尾
    }

    public void addBook(int i, String isbn, String bname, String bauthor,
                        String bpublisher, double bprice, String no) {
        booklist.add(i, new RentBook(isbn,bname,bauthor,bpublisher,bprice,no)); // 在指定位置插入
    }

    public void searchBook(String bookNo) {  // 完善图书查询方法：按入库号查询
        boolean flag = false;
        for(j=0; j<booklist.size(); j++) {
            if(booklist.get(j).getBookNo().equals(bookNo)) {
                System.out.println(booklist.get(j));
                flag = true;
            }
        }
        if(flag == false) {
            System.out.println("没有找到指定的书.");
        }
    }

    public void editBook(String isbn, double bprice) {  // 完善图书修改方法：按统一书号修改定价
        for(j=0; j<booklist.size(); j++) {
            if(booklist.get(j).getISBN().equals(isbn)) {
                booklist.get(j).setPrice(bprice);  // 修改定价
                System.out.println(booklist.get(j));  // 提取修改后信息
            }
        }
    }

    public void deleteBook(String isbn) {  // 完善图书删除方法：按统一书号删除
        for(j=0; j<booklist.size(); j++) {
            if(booklist.get(j).getISBN().equals(isbn)) {
                booklist.remove(j);  // 删除该书
                System.out.println("成功删除该书.");
            }
        }
    }

    public void displayBook() {  // 输出图书清单
        for(RentBook b : booklist) {  // 用增强for循环逐条列出
            System.out.println(b);
        }
    }

    /*5.定义读者信息添加和输出的成员方法*/
    public void addReader(String name, String grade) {  // 创建不同身份的读者
        readerlist.add(new VIPReadernew(name,grade));  // 将新读者插在表尾
    }

    public void displayReader() {  // 输出读者清单
        for(VIPReadernew r : readerlist) {  // 用增强for循环逐条列出
            System.out.println(r);
        }
    }

    /*6.定义租阅业务相关的成员方法*/
    public void addRentRecord(RentBook bk, VIPReadernew rd, String rdate) {  // 修改后的租书方法
        if(rentlist.size() == 0) {  // 如果租书清单为空，则添加此书
            rentlist.add(new RentRecord(bk,rd,rdate));
        } else {
            boolean flag = true;
            for(j=0; j<rentlist.size(); j++) {  // 遍历租书清单
                if(rentlist.get(j).getBookNo().equals(bk.getBookNo())) {  // 判断待租图书是否已存在
                    System.out.println(rentlist.get(j).getBookNo()+"已被借出.");
                    flag = false;
                }
            }
            if(flag) {  // 如果租书清单中不存在待租之书，则添加到租书清单中
                rentlist.add(new RentRecord(bk,rd,rdate));
            }
        }
    }

    public void returnBook(RentBook bk, VIPReadernew rd, String redate) {  // 新增的还书方法
        for(j=0; j<rentlist.size(); j++) {  // 遍历租书清单
            if(rentlist.get(j).getBookNo().equals(bk.getBookNo())) {  // 如果存在被租图书，则归还
                renter = rd;
                rentlist.get(j).setReturnDate(redate);  // 设置还书日期
                rentlist.get(j).setRent(deadTime,normalRent,delayRent,renter.getPercent());
//                rentlist.get(j).setBonusPoints();
                renter.setBonusPoints(rentlist.get(j).getBonusPoints());  // 累计会员积分
                renter.promotion(renter.getReadergrade());  // 参加会员优惠活动
                if(renting()) {  // 调用计算租金方法，当余额支付租金时则添加该租阅记录
                    returnlist.add("\n"+renter.getReaderName()+"|"+renter.getReadergrade()
                            +",账号余额="+renter.getBalance()+"当前积分="+
                            renter.getBonusPoints()+"\n借阅的图书是:"+rentlist.get(j).
                            toString());
                    rentlist.remove(j);  // 在租书清单中删除已经归还的图书
                }
            }
        }
    }

    public boolean renting() {  // 增加了异常处理机制的支付租金方法
        try {
            renter.payRent(rentlist.get(j).getRent());  // 计算租金，当账户余额足以支付租金
        } catch (PayException e) {
            throw new RuntimeException(e);
        }
        System.out.println(renter.getReaderName() + "支付租金:" +
                rentlist.get(j).getRent() + "成功!");
        return true;
    }

    public void displayRentInfo() {  // 输出租书信息
        for(RentRecord br : rentlist) {  // 用增强for循环逐条列出
            System.out.println(br);
        }
    }

    public void displayReturnInfo() {  // 输出还书信息
        for(String bre : returnlist) {  // 用增强for循环逐条列出
            System.out.println(bre);
        }
    }
}